﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AutoMapper;
using Sharp.DataTransferObject;
using Sharp.Domain.PlatformBoundedContext.UserModule.Aggregates;
using Sharp.Infrastructure;

namespace Sharp.Application.Platform
{
    public partial class UserServiceImpl
    {
        /// <summary>
        ///     根据指定的ID值，获取角色。
        /// </summary>
        /// <param name="id">指定的角色ID值。</param>
        /// <returns>角色。</returns>
        public RoleDTO GetRoleByKey(Guid id)
        {
            return Mapper.Map<Role, RoleDTO>(_roleRepository.Get(id));
        }

        /// <summary>
        ///     获取所有角色。
        /// </summary>
        /// <returns>所有角色。</returns>
        public IList<RoleDTO> GetRoles()
        {
            var roles = _roleRepository.GetList();
            IList<RoleDTO> result = null;
            if (roles != null &&
                roles.Any())
            {
                result = new List<RoleDTO>();
                roles.ToList()
                    .ForEach(r => result.Add(Mapper.Map<Role, RoleDTO>(r)));
            }
            return result;
        }

        /// <summary>
        ///     创建角色。
        /// </summary>
        /// <param name="roleDTO">需要创建的角色。</param>
        /// <returns>已创建的角色。</returns>
        public Result CreateRoles(RoleDTO roleDTO)
        {
            var res = new Result();

            // PerformCreateObjects(_roleRepository, roleDTO);
            return null;
            return res;
        }

        /// <summary>
        ///     更新角色。
        /// </summary>
        /// <param name="roleDTOs">需要更新的角色。</param>
        /// <returns>已更新的角色。</returns>
        public IList<RoleDTO> UpdateRoles(IList<RoleDTO> roleDTOs)
        {
            return null;
            //return PerformUpdateObjects<List<RoleDTO>, RoleDTO, Role>(roleDTOs.ToList(),
            //    _roleRepository,
            //    rdo => rdo.Id,
            //    (r, rdo) =>
            //    {
            //        if (!string.IsNullOrEmpty(rdo.Name))
            //            r.Name = rdo.Name;
            //        if (!string.IsNullOrEmpty(rdo.Description))
            //            r.Remark = rdo.Description;
            //    });
        }

        /// <summary>
        ///     删除角色。
        /// </summary>
        /// <param name="roleIDs">需要删除的角色ID值列表。</param>
        public void DeleteRoles(IList<Guid> roleIDs)
        {
        }

        /// <summary>
        ///     将指定的用户赋予指定的角色。
        /// </summary>
        /// <param name="userId">需要赋予角色的用户ID值。</param>
        /// <param name="roleId">需要向用户赋予的角色ID值。</param>
        public void AssignRole(Guid userId, Guid roleId)
        {
            var user = _userRepository.Get(userId);
            var role = _roleRepository.Get(roleId);
            _domainService.AssignRole(user, role);
        }

        /// <summary>
        ///     将指定的用户从角色中移除。
        /// </summary>
        /// <param name="userId">用户ID值。</param>
        public void UnassignRole(Guid userId)
        {
            var user = _userRepository.Get(userId);
            _domainService.UnassignRole(user);
        }
    }
}
